package com.gzx.bi.modular.screen.util;

import com.gzx.bi.modular.screen.vo.GzxMonthCallVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.HashSet;
import java.util.Set;

/**
 * 大屏工具类
 */
@Slf4j
public class ScreenUtils {

    //生成比某个数字小5000-10000的随机数
    public static int generateRandomNumber(int randomNumber) {
        if (randomNumber < 10000) {
            return 0;
        }
        int min = randomNumber - 5000;
        int max = randomNumber - 1000;
        return (int) (Math.random() * (max - min + 1)) + min;
    }

    private static final BigDecimal TEN_THOUSAND = new BigDecimal("10000");
    private static final BigDecimal HUNDRED_MILLION = new BigDecimal("100000000");

    public static String convertMoney(long number) {
        // 定义单位和结果变量
        String unit;
        BigDecimal result;
        BigDecimal amount = new BigDecimal(number);

        // 判断金额范围选择单位
        if (amount.compareTo(HUNDRED_MILLION) >= 0) {
            result = amount.divide(HUNDRED_MILLION, 2, RoundingMode.HALF_UP);
            unit = "亿";
        } else if (amount.compareTo(TEN_THOUSAND) >= 0) {
            result = amount.divide(TEN_THOUSAND, 2, RoundingMode.HALF_UP);
            unit = "万";
        } else {
            result = amount;
            unit = "元";
        }

        // 格式化输出（保留两位小数，自动补零）
        DecimalFormat df = new DecimalFormat("0.00");
        return df.format(result) + unit;
    }

    //格式化数字，数字超过1亿的拼成1亿，不到1亿的就是1亿
    public static String formatLongNumber(long number) {
        if (number >= 100000000) {
            return String.format("%.2f亿", number / 100000000.0); // 例如：1.23亿
        } else if (number >= 10000000) {
            return String.format("%.2f千万", number / 10000000.0); // 例如：1.23千万
        } else if (number >= 1000000) {
            return String.format("%.2f百万", number / 1000000.0); // 例如：1.23百万
        } else if (number >= 100000) {
            return String.format("%.2f十万", number / 100000.0); // 例如：1.23十万
        } else if (number >= 10000) {
            return String.format("%.2f万", number / 10000.0); // 例如：1.23万
        } else if (number >= 1000) {
            return String.format("%.2f千", number / 1000.0); // 例如：1.23千
        } else if (number >= 100) {
            return String.format("%.2f百", number / 100.0); // 例如：1.23百
        } else {
            return String.valueOf(number); // 低于百返回原数字
        }
    }

    //格式化数字，数字超过10w的拼成10w，不到10w的就是几千
    public static String formatNumber(int number) {
        if (number >= 100000) {
            return String.valueOf((number / 10000) + "w");
        } else if (number >= 10000) {
            return String.valueOf((number / 10000) + "w");
        } else {
            return "1k";
        }
    }

    //生成32位uuid
    public static String generateUUID() {
        return java.util.UUID.randomUUID().toString().replace("-", "");
    }

    // 合并属性
    public static GzxMonthCallVo mergePros(GzxMonthCallVo target, GzxMonthCallVo... sources) {
        for (GzxMonthCallVo source : sources) {
            // 获取source中为null的属性名
            Set<String> nullProperties = getNullPropertyNames(source);
            // 合并所有属性，忽略null属性和id
            BeanUtils.copyProperties(source, target, nullProperties.toArray(new String[0]));
        }
        return target;
    }

    // 获取对象中为null的属性名
    private static Set<String> getNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        PropertyDescriptor[] pds = src.getPropertyDescriptors();

        Set<String> emptyNames = new HashSet<>();
        for (PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            log.info("属性名：{}，属性值：{}", pd.getName(), srcValue);
            if (srcValue == null || "".equals(srcValue) || (srcValue instanceof Integer && (Integer) srcValue == 0)) {
                emptyNames.add(pd.getName());
            }
        }
        // 始终忽略id属性
        emptyNames.add("id");
        return emptyNames;
    }
}